package com.mmy.dao.permission;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.mmy.domain.permissionmenu.TConstMenu;

public interface TConstMenuRepository extends JpaRepository<TConstMenu, Integer> {

	/**
	 * 函数功能说明： 通过菜单ID查找菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单对象
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where iMenuID = :iMenuID", nativeQuery = true)
	TConstMenu findByMenuID(@Param("iMenuID") int iMenuID);

	/**
	 * 函数功能说明： 获取最大菜单ID
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：Object
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select MAX(iMenuID) from tConstMenu where  left (iMenuID,2) = '11'", nativeQuery = true)
	Object getMaxMenuID();

	/**
	 * 函数功能说明： 根据菜单ID删除菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：无返回值
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Transactional
	@Modifying
	@Query(value = "delete from tConstMenu where tConstMenu.iMenuID in (:iMenuID)", nativeQuery = true)
	void delMenu(@Param("iMenuID") List<Integer> iMenuID);

	/**
	 * 函数功能说明： 查找不包含已有ID的菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select * from tConstMenu where iMenuID NOT IN (:lstMenuID) and iType = 1", nativeQuery = true)
	List<TConstMenu> findMenuNotInID(@Param("lstMenuID") List<Integer> lstMenuID);

	/**
	 * 函数功能说明： 新增菜单ID
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：无返回值
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Transactional
	@Modifying
	@Query(value = "INSERT INTO tConstMenu(iMenuID, iUpMenuID, cMenuName, cUrl, iSort, iType, iState, dCreateDate, cCreator, dModifyDate, cReviser, cMemo, cSpare1, cSpare2, cSpare3, cSpare4, cSpare5) VALUES (:menuID, 0, NULL, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL)", nativeQuery = true)
	void save(@Param("menuID") int menuID);

	/**
	 * 函数功能说明： 获取排序最大值
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：Object
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select MAX(iSort) from tConstMenu", nativeQuery = true)
	Object getMaxSort();

	/**
	 * 函数功能说明： 获取前台菜单ID最大值
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：Object
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select MAX(iMenuID) from tConstMenu where  left (iMenuID,2) = '10'", nativeQuery = true)
	Object getMaxFrontMenuID();

	/**
	 * 函数功能说明： 获取后台菜单ID最大值
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：Object
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select MAX(iMenuID) from tConstMenu where  left (iMenuID,1) = '3'", nativeQuery = true)
	Object getMaxBackMenuID();

	/**
	 * 函数功能说明： 获取全部菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select * from tConstMenu group by iMenuID,iType order by iMenuID,isort", nativeQuery = true)
	List<TConstMenu> findAll();

	/**
	 * 函数功能说明： 获取全部顶级菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select * from tConstMenu  where iType = 1 order by isort", nativeQuery = true)
	List<TConstMenu> findAllMenu();

	/**
	 * 函数功能说明： 根据菜单名称、类型查找菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where cMenuName = :cMenuName and iType = :iType", nativeQuery = true)
	List<TConstMenu> findByMenuName(@Param("cMenuName") String cMenuName, @Param("iType") int iType);

	/**
	 * 函数功能说明： 根据菜单URL查找菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where cUrl = :strUrl", nativeQuery = true)
	List<TConstMenu> findByUrl(@Param("strUrl") String strUrl);

	/**
	 * 函数功能说明： 根据菜单ID查找菜单状态
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select iState  from tConstMenu where iMenuID = :iMenuID", nativeQuery = true)
	int findStateByUpMenuID(@Param("iMenuID") int iMenuID);

	/**
	 * 函数功能说明： 根据菜单排序查找菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单对象
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where iSort = :iSort and iType = 1", nativeQuery = true)
	TConstMenu findBySort(@Param("iSort") byte iSort);

	/**
	 * 函数功能说明： 根据上级菜单ID查找子菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select * from tConstMenu where iUpMenuID = :iUpMenuID", nativeQuery = true)
	List<TConstMenu> findByUpMenuID(@Param("iUpMenuID") int iUpMenuID);

	/**
	 * 函数功能说明：根据上级菜单ID、排序查找子菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单对象
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select * from tConstMenu where iSort = :iSort and iUpMenuID = :iUpMenuID and iType = 0", nativeQuery = true)
	TConstMenu findBySortUpMenuID(@Param("iSort") int iSort, @Param("iUpMenuID") int iUpMenuID);

	/**
	 * 函数功能说明： 查找顶级菜单数量
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select count(*) from tConstMenu where iType = 1", nativeQuery = true)
	int countUpMenu();

	/**
	 * 函数功能说明： 根据菜单名称、类型、包含子菜单的情况分页查找后台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from vConstMenu where ((:strMenuName = \"\" or cMenuName like %:strMenuName%) or (:strUpMenuName = \"\" or cUpMenuName like %:strUpMenuName%)) and iState = 2 order by iID limit :iTempPageNo,:iPageSize", nativeQuery = true)
	List<TConstMenu> findBackByMenuNameAndChild(@Param("strMenuName") String strMenuName,@Param("strUpMenuName") String strUpMenuName,
			@Param("iTempPageNo") int iTempPageNo, @Param("iPageSize") int iPageSize);

	/**
	 * 函数功能说明： 根据菜单名称、类型、包含子菜单的情况查找后台菜单数量
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select count(*)  from vConstMenu where ((:strMenuName = \"\" or cMenuName like %:strMenuName%) or (:strUpMenuName = \"\" or cUpMenuName like %:strUpMenuName%))  and iState = 2 order by iID ", nativeQuery = true)
	int countBackByMenuNameAndChild(@Param("strMenuName") String strMenuName,
			@Param("strUpMenuName") String strUpMenuName);

	/**
	 * 函数功能说明： 根据菜单名称、类型、不包含子菜单的情况分页查找后台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from vConstMenu where (:strMenuName = \"\" or cMenuName like %:strMenuName%) and (:strType = \"\" or iType = :strType) and iState = 2 order by iID limit :iTempPageNo,:iPageSize", nativeQuery = true)
	List<TConstMenu> findBackByMenuName(@Param("strMenuName") String strMenuName, @Param("strType") String strType,
			@Param("iTempPageNo") int iTempPageNo, @Param("iPageSize") int iPageSize);

	/**
	 * 函数功能说明： 根据菜单名称、类型、不包含子菜单的情况查找后台菜单数量
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select count(*)  from vConstMenu where (:strMenuName = \"\" or cMenuName like %:strMenuName%) and (:strType = \"\" or iType = :strType) and iState = 2 order by iID ", nativeQuery = true)
	int countBackByMenuName(@Param("strMenuName") String strMenuName, @Param("strType") String strType);

	/**
	 * 函数功能说明： 根据菜单名称、类型、包含子菜单的情况分页查找前台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from vConstMenu where ((:strMenuName = \"\" or cMenuName like %:strMenuName%) or (:strUpMenuName = \"\" or cUpMenuName like %:strUpMenuName%))  and (iState = 1 or iState = 3) order by iID limit :iTempPageNo,:iPageSize", nativeQuery = true)
	List<TConstMenu> findFrontByMenuNameAndChild(@Param("strMenuName") String strMenuName,
			@Param("strUpMenuName") String strUpMenuName,
			@Param("iTempPageNo") int iTempPageNo, @Param("iPageSize") int iPageSize);

	/**
	 * 函数功能说明： 根据菜单名称、类型、包含子菜单的情况查找前台菜单数量
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select count(*)  from vConstMenu where ((:strMenuName = \"\" or cMenuName like %:strMenuName%) or (:strUpMenuName = \"\" or cUpMenuName like %:strUpMenuName%)) and (iState = 1 or iState = 3) order by iID ", nativeQuery = true)
	int countFrontByMenuNameAndChild(@Param("strMenuName") String strMenuName,
			@Param("strUpMenuName") String strUpMenuName);

	/**
	 * 函数功能说明： 根据菜单名称、类型、不包含子菜单的情况分页查找前台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */

	@Query(value = "select *  from vConstMenu where (:strMenuName = \"\" or cMenuName like %:strMenuName%) and (:strType = \"\" or iType = :strType) and (iState = 1 or iState = 3) order by iID limit :iTempPageNo,:iPageSize", nativeQuery = true)
	List<TConstMenu> findFrontByMenuName(@Param("strMenuName") String strMenuName, @Param("strType") String strType,
			@Param("iTempPageNo") int iTempPageNo, @Param("iPageSize") int iPageSize);

	/**
	 * 函数功能说明： 根据菜单名称、类型、不包含子菜单的情况查找前台菜单数量
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：int
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select count(*)  from vConstMenu where (:strMenuName = \"\" or cMenuName like %:strMenuName%) and (:strType = \"\" or iType = :strType) and (iState = 1 or iState = 3) order by iID ", nativeQuery = true)
	int countFrontByMenuName(@Param("strMenuName") String strMenuName, @Param("strType") String strType);

	/**
	 * 函数功能说明： 查找前台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where (iState = 1 or iState = 3)", nativeQuery = true)
	List<TConstMenu> findFront();

	/**
	 * 函数功能说明： 查找后台菜单
	 * 
	 * @param 参数说明
	 * @return 返回值说明 ：菜单集合
	 * @throws 异常处理说明
	 * @author 创建人 shangzl
	 * @date 创建日期 2020-11-12
	 */
	@Query(value = "select *  from tConstMenu where iState = 2", nativeQuery = true)
	List<TConstMenu> findBack();

}
